/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package compiladores2;


/**
 *
 * @author Yoas
 */
public class Compiladores2{

    /**
     * @param args the command line arguments
     * row almacena el número de renglones que tiene el archivo
     * j nos indica el renglón en el que nos encontramos 
     * i nos permite recorrer los caracteres de cada renglón
     * tam almacena el tamaño de cada renglón
     * Cl nos ayuda a saber a que categoría pertenece el caracter que se está leyendo
     * edo nos indica el estado actual en el que nos encontramos
     * edoSig nos indica el estado siguiente
     * c es donde se almacena cada caracter que se lee
     * 
     * Como el archivo a leer se almacenó en un arreglo de cadenas se recorrerá renglón por renglón caracter por caracter todo el archivo
     * Al leer el caracter se preguntará primero si éste existe en la tabla de trasnición, si existe veremos a qué estado avanzaremos
     * si el estado es -1 significa que hay un error léxico
     * si el estado es diferente de 0 y el caracter leido no es comentario ni espacio en blacno guardaremos en el buffer el caracter
     * si tenemos que movernos al estado inicial 0 y se trata de un estado de aceptación se creará un Token y dependiendo de la clase
     * que se trate es como tendrá el lexema y el tipo, después se limpiará el buffer y se almacenará el token en la tabla de simbolos
     * se agregará el caracter leído
     */
    public static void main(String[] args) {
        TablaTransicion trans=new TablaTransicion();
        Tabla simb=new Tabla();
        Lectura a=new Lectura();
        String file[]=a.lectura();
        int row=file.length,clase;  
        String buffer="";
        char c;
        int j=0,tam=100,edo=0,edoSig=0; 
        int Cl;
        int i=0;
        while(j<row){
                        tam=file[j].length();
                        edo=0;
                        while(i<tam){                                                
                            if(tam==0)
                                edoSig=0;
                            else{
                                c=file[j].charAt(i);
                                Cl=columna(c);
                                System.out.println(c+" "+edo+" "+Cl+" "+i);
                                if(Cl==-1){
                                    System.out.println("Error léxico en la línea "+j+1+" con el caracter "+ c);
                                    buffer="";
                                    break;
                                }
                                else{
                                    edoSig=trans.tablaTransicion[edo][Cl];
                                    //System.out.println(c+" "+edoSig+" "+edo+" "+Cl);
                                    if(edoSig==0||edoSig==1||edoSig==2){
                                        clase=revClase(edo);
                                        
                                        if(clase==0){
                                            if(trans.tablaTransicion[edo][16]!=1){
                                                System.out.println("Error léxico en la línea "+j+1+" con el caracter"+ c);
                                                buffer="";
                                            }
                                            else{
                                                Token reser=new Token(buffer,clase);
                                                simb.insertar(reser); 
                                                int pos=simb.buscar(reser);
                                                //simb.borrar(reser);
                                                String lexema= Integer.toString(pos);
                                                Token reservada=new Token(lexema,clase);
                                                //simb.insertar(reservada);    
                                                simb.modificar(reser,reservada);
                                            }
                                        }
                                        else if(clase==1){
                                            if(trans.tablaTransicion[edo][16]!=1){
                                                System.out.println("Error léxico en la línea "+j+1+" con el caracter"+ c);
                                                buffer="";
                                            }
                                            else{
                                                Token identi=new Token(buffer,clase);
                                                simb.insertar(identi);
                                                int pos=simb.buscar(identi);
                                                //simb.borrar(identi);
                                                String lexema= Integer.toString(pos);
                                                Token identificador=new Token(lexema,clase);
                                                //simb.insertar(identificador); 
                                                simb.modificar(identi,identificador);
                                            }
                                        }
                                        else if(clase==2){
                                            if(trans.tablaTransicion[edo][16]!=1){
                                                System.out.println("Error léxico en la línea "+j+1+" con el caracter"+ c);
                                                buffer="";
                                            }
                                            else{
                                                Token oper=new Token(buffer,clase);
                                                simb.insertar(oper);
                                            }
                                        }
                                        else if(clase==3){
                                            if(trans.tablaTransicion[edo][16]!=1){
                                                System.out.println("Error léxico en la línea "+j+1+" con el caracter"+ c);
                                                buffer="";
                                            }
                                            else{
                                                Token arit=new Token(buffer,clase);
                                                simb.insertar(arit);
                                            }
                                        }
                                        else if(clase==4){
                                            if(trans.tablaTransicion[edo][16]!=1){
                                                System.out.println("Error léxico en la línea "+j+1+" con el caracter"+ c);
                                                buffer="";
                                            }
                                            else{
                                                Token entero=new Token(buffer,clase);
                                                simb.insertar(entero);
                                            }
                                        }
                                        else if(clase==5){
                                            if(trans.tablaTransicion[edo][16]!=1){
                                                System.out.println("Error léxico en la línea "+j+1+" con el caracter"+ c);
                                                buffer="";
                                            }
                                            else{
                                                Token flot=new Token(buffer,clase);
                                                simb.insertar(flot);
                                            }
                                        }
                                                          
                                        buffer="";
                                        buffer=buffer+c;
  
                                    }
                                    else if(edoSig==-1){
                                        System.out.println("Error léxico en la línea "+j+1+" con el caracter"+ c);
                                        break;
                                    }
                                    
                                    else{
                                        if(Cl!=13 &&Cl!=3) //No se almacena en buffer si son espacios en blanco o comentarios
                                             buffer=buffer+c; 
                                    }                                 
                                }
                            }
                        i++;    
                        edo=edoSig;  
                        } 
                    j++;
                    i=0;
           
        }
        
        System.out.println(simb.toString());
        /*Token tok=new Token("print",0);
        Token t=new Token("read",0);
        Token za=new Token("asdf",3);
        Token ta=new Token("res",5);      
        
        simb.insertar(tok);
        simb.insertar(t);
        simb.insertar(za);
        simb.insertar(ta);    
        System.out.println(simb.toString());
        System.out.println(trans.tablaTransicion[0][3]);
        */
        
            
    }  

    /*Función que recibe un entero y devuleve un entero
     * Recibe el estado en que se encuentra el autómata y devuelve la clase a la que pertenece
     *      
     */
    public static int revClase(int edo){
        int clase=0;
        if(edo==16||edo==18)
            clase=0;
        else if(edo==5||edo==6||edo==7||edo==11||edo==12||edo==14||edo==15||edo==17)
            clase=1;
        else if(edo==1)
            clase=2;
        else if(edo==2)
             clase=3;
        else if(edo==3||edo==0)
             clase=4;
        else if(edo==13)
             clase=5;
        else 
            clase=-1;             
        return clase;
        }
    /*
     * Función que recibe el caracter que se está leyendo y devuelve la columna de la tabla de transición a la cuál pertenece
     * Si el caracter leído no pertenece a inguna clase se devuleve un -1
     * 
     */
    public static int columna(char c){
        int Cl=0;
        if(c=='=')
            Cl=0;
        else if(c=='+'||c=='-'||c=='*'||c=='/'||c=='%')
            Cl=1;
        else if(c=='0'||c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='7'||c=='8'||c=='9')
            Cl=2;
        else if(c=='#')
            Cl=3;      
        else if(c=='r')
            Cl=4;
        else if(c=='e')
            Cl=5;
        else if(c=='a')
            Cl=6;
        else if(c=='d')
            Cl=7;
        else if(c=='p')
            Cl=8;
        else if(c=='i')
            Cl=9;
        else if(c=='n')
            Cl=10;
        else if(c=='t')
            Cl=11;            
        else if(c=='b'||c=='c'||c=='f'||c=='g'||c=='h'||c=='j'||c=='k'||c=='l'||c=='m'||c=='o'||c=='q'||c=='s'||c=='u'||c=='v'||c=='w'||c=='x'||c=='y'||c=='z') //letras
            Cl=12;
        else if(c==' ')
            Cl=13;
        else if(c=='\n')
            Cl=14;
        else if(c=='.')
             Cl=15;
         else                       
             Cl=-1;//cualquier otra cosa                   
        return Cl;
        }
}
